package com.hss.thread;

/**
 *，yield意味着放手，放弃，投降。一个调用yield()方法的线程告诉虚拟机它乐意让其他线程占用自己的位置。
 * 这表明该线程没有在做一些紧急的事情。
 * 注意，这仅是一个暗示，并不能保证不会产生任何影响。
 *  public static native void yield();
 *
 *
 * Yield是一个静态的原生(native)方法
 * Yield告诉当前正在执行的线程把运行机会交给线程池中拥有相同优先级的线程。
 * Yield不能保证使得当前正在运行的线程迅速转换到可运行的状态
 * 它仅能使一个线程从运行状态转到可运行状态，而不是等待或阻塞状态
 *
 *
 * 调用yield()方法时，两个线程依次打印，然后将执行机会交给对方，一直这样进行下去
 */
public class YeildTest {
  static   class Producer extends Thread
    {
        public void run()
        {
            for (int i = 0; i < 5; i++)
            {
                System.out.println("I am Producer : Produced Item " + i);
                Thread.yield();
            }
        }
    }

    static  class Consumer extends Thread {
        public void run() {
            for (int i = 0; i < 5; i++) {
                System.out.println("I am Consumer : Consumed Item " + i);
                Thread.yield();
            }
        }
    }

    /**
     * 我随意的创建了名为生产者和消费者的两个线程。
     * 生产者设定为最小优先级，消费者设定为最高优先级。
     * 在Thread.yield()注释和非注释的情况下我将分别运行该程序。
     * 没有调用yield()方法时，虽然输出有时改变，
     * 但是通常消费者行先打印出来，然后事生产者。
     * @param args
     */
    public static void main(String[] args) {
        Thread producer = new Producer();
        Thread consumer = new Consumer();

        producer.setPriority(Thread.MIN_PRIORITY); //Min Priority
        consumer.setPriority(Thread.MAX_PRIORITY); //Max Priority

        producer.start();
        consumer.start();
    }
}
